package midend.IR_Type;

import java.util.ArrayList;
import java.util.List;

public class IR_Array implements IR_Type{
    //当前的数组类型 是i32 还是pointer 是完整数组的一个低一维形态
    private IR_Type Array_Type;
    private int Array_length;
    private List<Integer> Dimension;
    private boolean init;

    public IR_Type get_Array_Type() {
        return Array_Type;
    }

    public int get_Array_length() {
        return Array_length;
    }

    public List<Integer> get_Dimension() {
        return Dimension;
    }

    public boolean get_init() {
        return init;
    }

    public void setInit(boolean init) {
        this.init = init;
    }

    //源代码中使用反向迭代的方式生成
    public IR_Array(IR_Type Array_Type,int len){
        this.Array_Type = Array_Type;
        this.Array_length = len;
        this.init = false;
        Dimension = new ArrayList<>();
        if(this.Array_Type instanceof IR_Array){
            //多维数组的情况下
            for(int i=0;i<((IR_Array)this.Array_Type).get_Dimension().size();i++) {
                Dimension.add(((IR_Array) this.Array_Type).get_Dimension().get(i));
            }
        }
        Dimension.add(0,this.Array_length);
    }
    @Override
    public String get_TypeName() {
        return "[" + this.Array_length  + " x " + Array_Type.get_TypeName() + "]";
    }

    @Override
    public int get_Const_Type() {
        return IR_Const.IR_ConstArray;
    }

    public int getSize() {
        if (!(Array_Type instanceof IR_Array)) {
            return Array_length;
        }
        else {
            return ((IR_Array) Array_Type).getSize() * Array_length;
        }
    }

    public int getPos(){
        if(!(Array_Type instanceof IR_Array)){
            return 1;
        }
        return ((IR_Array) Array_Type).getPos() + 1;
    }
    @Override
    public String toString() {
        return "Array_Type=" + Array_Type +
                ", Array_length=" + Array_length +
                ", Dimension=" + Dimension +
                ", init=" + init;
    }
}
